home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C/C++ Users Group Library 1996 July
/
C-C++ Users Group Library July 1996.iso
/
listings
/
v_11_02
/
1102069a
< prev
next >
Wrap
Text File
|
1992-12-12
|
14KB
|
467 lines
/**********************************************
*
* grow(...
*
* This function is an object detector.
* Its input is an binary image array
* containing 0's and value's.
* It searches through the image and connects
* the adjacent values.
*
***********************************************/
grow(binary, value)
short binary[ROWS][COLS],
value;
{
char name[80];
int first_call,
i,
j,
object_found,
pointer,
pop_i,
pop_j,
stack_empty,
stack_file_in_use;
short g_label, stack[STACK_SIZE][2];
/*************************************
*
* Now begin the process of growing
* regions.
*
**************************************/
g_label = 2;
object_found = 0;
first_call = 1;
for(i=0; i<ROWS; i++){
for(j=0; j<COLS; j++){
stack_file_in_use = 0;
stack_empty = 1;
pointer = -1;
/**********************************
*
* Search for the first pixel of
* a region.
*
***********************************/
if(binary[i][j] == value){
label_and_check_neighbor(binary, stack, g_label,
&stack_empty, &pointer, i, j,
value, &stack_file_in_use,
&first_call);
object_found = 1;
} /* ends if binary[i]j] == value */
/*****************************
*
* If the stack is not empty,
* pop the coordinates of
* the pixel off the stack
* and check its 8 neighbors.
*
*******************************/
while(stack_empty == 0){
pop_i = stack[pointer][0]; /* POP */
pop_j = stack[pointer][1]; /* OPERATION */
--pointer;
if(pointer <= 0){
if(stack_file_in_use){
pop_data_off_of_stack_file(
stack,
&pointer,
&stack_file_in_use);
} /* ends if stack_file_in_use */
else{
pointer = 0;
stack_empty = 1;
} /* ends else stack file is
not in use */
} /* ends if point <= 0 */
label_and_check_neighbor(binary,
stack, g_label,
&stack_empty,
&pointer, pop_i,
pop_j, value,
&stack_file_in_use,
&first_call);
} /* ends while stack_empty == 0 */
if(object_found == 1){
object_found = 0;
++g_label;
} /* ends if object_found == 1 */
} /* ends loop over j */
} /* ends loop over i */
printf("\nGROW> found %d objects", g_label);
} /* ends grow */
/********************************************
*
* label_and_check_neighbors(...
*
* This function labels a pixel with an object
* label and then checks the pixel's 8
* neighbors. If any of the neigbors are
* set, then they are also labeled.
*
***********************************************/
label_and_check_neighbor(binary_image, stack,
g_label, stack_empty,
pointer, r, e, value,
stack_file_in_use,
first_call)
int e,
*first_call,
*pointer,
r,
*stack_empty,
*stack_file_in_use;
short binary_image[ROWS][COLS],
g_label,
stack[STACK_SIZE][2],
value;
{
int already_labeled = 0,
i, j;
if (binary_image[r][e] == g_label)
already_labeled = 1;
binary_image[r][e] = g_label;
/***************************************
*
* Look at the 8 neighors of the
* point r,e.
*
* Ensure the points you are checking
* are in the image, i.e. not less
* than zero and not greater than
* ROWS-1 or COLS-1.
*
***************************************/
for(i=(r-1); i<=(r+1); i++){
for(j=(e-1); j<=(e+1); j++){
if((i>=0) &&
(i<=ROWS-1) &&
(j>=0) &&
(j<=COLS-1)){
if(binary_image[i][j] == value){
*pointer = *pointer + 1;
stack[*pointer][0] = i; /* PUSH */
stack[*pointer][1] = j; /* OPERATION */
*stack_empty = 0;
if(*pointer >= (STACK_SIZE -
STACK_FILE_LENGTH)){
push_data_onto_stack_file(stack,
pointer, first_call);
*stack_file_in_use = 1;
} /* ends if *pointer >=
STACK_SIZE - STACK_FILE_LENGTH*/
} /* end of if binary_image == value */
} /* end if i and j are on the image */
} /* ends loop over i rows */
} /* ends loop over j columns */
} /* ends label_and_check_neighbors */
/****************************************
*
* push_data_onto_stack_file(...
*
* This function takes the stack array
* and pushes it onto the stack file.
*
*****************************************/
push_data_onto_stack_file(stack, pointer, first_call)
int *first_call, *pointer;
short stack[STACK_SIZE][2];
{
char backup_file_name[MAX_NAME_LENGTH];
FILE *backup_file_pointer, *stack_file_pointer;
int diff, i;
short holder[STACK_FILE_LENGTH][2];
printf("\nSFO> Start of push_data_onto_stack ");
diff = STACK_SIZE - STACK_FILE_LENGTH;
/*******************************************
*
* Copy the elements to be stored to the
* stack file into holder
*
********************************************/
for(i=0; i<STACK_FILE_LENGTH; i++){
holder[i][0] = stack[i][0];
holder[i][1] = stack[i][1];
}
/*******************************************
*
* Move the elements of the stack down
*
*******************************************/
for(i=0; i<diff; i++){
stack[i][0] = stack[i + STACK_FILE_LENGTH][0];
stack[i][1] = stack[i + STACK_FILE_LENGTH][1];
}
/*******************************************
*
* Fill the top of the stack with zeros
*
*******************************************/
for(i=diff; i<STACK_SIZE; i++){
stack[i][0] = 0;
stack[i][1] = 0;
}
*pointer = *pointer - STACK_FILE_LENGTH;
/************************************************
*
* Store the holder array into the stack file.
* Open the stack file for writing in binary
* mode. If the file does not exist it will be
* created. If the file does exist it will be
* over written.
*
* PUSH - IF first_time == 1 then write to stack
* ELSE write to stack.bak
* append stack onto stack.bak
* copy stack.bak to stack
* this has the effect of writing
* to the beginning of the stack.
*
************************************************/
if(*first_call == 1){
*first_call = *first_call + 1;
if((stack_file_pointer = fopen(STACK_FILE,"wb"))
== NULL)
printf("\nSFO> Could not open stack file");
else{
/*printf("\n\nSFO> Writing to stack file");*/
fwrite(holder, sizeof(holder),
1, stack_file_p